pacman::p_load(
tidyverse,
here,
RColorBrewer,
lubridate,
scales,
GGally,
stats,
corrplot,
mice,
VIM
)
flights_dt <- read_csv(here("clean_data/flights_clean.csv"))
Rows: 327346 Columns: 38
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (11): origin, origin_name, dest, dest_name, carrier, carrier_name, tailnum, manufacturer, model, engine, type
dbl (22): dep_delay, arr_delay, air_time, distance, flight, engines, seats, aircraft_age, lat, lon, alt, wind_di...
dttm (5): dep_time, sched_dep_time, arr_time, sched_arr_time, time_hour
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")
summary(flights_dt)
dep_time sched_dep_time dep_delay origin origin_name
Min. :2013-01-01 05:17:00 Min. :2013-01-01 05:15:00 Min. : -43.00 Length:327346 Length:327346
1st Qu.:2013-04-05 05:56:00 1st Qu.:2013-04-05 06:00:00 1st Qu.: -5.00 Class :character Class :character
Median :2013-07-04 09:52:30 Median :2013-07-04 09:54:30 Median : -2.00 Mode :character Mode :character
Mean :2013-07-03 18:10:05 Mean :2013-07-03 18:02:48 Mean : 12.56
3rd Qu.:2013-10-01 18:12:45 3rd Qu.:2013-10-01 18:14:45 3rd Qu.: 11.00
Max. :2013-12-31 23:56:00 Max. :2013-12-31 23:59:00 Max. :1301.00
arr_time sched_arr_time arr_delay dest
Min. :2013-01-01 00:03:00 Min. :2013-01-01 00:05:00 Min. : -86.000 Length:327346
1st Qu.:2013-04-05 01:03:00 1st Qu.:2013-04-05 03:43:30 1st Qu.: -17.000 Class :character
Median :2013-07-04 11:36:30 Median :2013-07-04 11:55:30 Median : -5.000 Mode :character
Mean :2013-07-03 19:41:02 Mean :2013-07-03 19:59:24 Mean : 6.895
3rd Qu.:2013-10-01 20:07:00 3rd Qu.:2013-10-01 20:20:30 3rd Qu.: 14.000
Max. :2014-01-01 00:00:00 Max. :2013-12-31 23:59:00 Max. :1272.000
dest_name air_time distance flight carrier carrier_name
Length:327346 Min. : 20.0 Min. : 80 Min. : 1 Length:327346 Length:327346
Class :character 1st Qu.: 82.0 1st Qu.: 509 1st Qu.: 544 Class :character Class :character
Mode :character Median :129.0 Median : 888 Median :1467 Mode :character Mode :character
Mean :150.7 Mean :1048 Mean :1943
3rd Qu.:192.0 3rd Qu.:1389 3rd Qu.:3412
Max. :695.0 Max. :4983 Max. :8500
tailnum manufacturer model engines seats engine
Length:327346 Length:327346 Length:327346 Min. :1.00 Min. : 2.0 Length:327346
Class :character Class :character Class :character 1st Qu.:2.00 1st Qu.: 55.0 Class :character
Mode :character Mode :character Mode :character Median :2.00 Median :149.0 Mode :character
Mean :1.99 Mean :137.5
3rd Qu.:2.00 3rd Qu.:189.0
Max. :4.00 Max. :450.0
NA's :48329 NA's :48329
aircraft_age lat lon alt time_hour wind_dir
Min. : 8.00 Min. :21.32 Min. :-157.92 Min. : 3.0 Min. :2013-01-01 10:00:00 Min. : 0.0
1st Qu.:15.00 1st Qu.:32.90 1st Qu.: -95.34 1st Qu.: 26.0 1st Qu.:2013-04-05 10:00:00 1st Qu.:130.0
Median :19.00 Median :36.08 Median : -83.99 Median : 433.0 Median :2013-07-04 13:00:00 Median :220.0
Mean :19.59 Mean :35.97 Mean : -89.61 Mean : 583.8 Mean :2013-07-03 21:56:45 Mean :201.9
3rd Qu.:22.00 3rd Qu.:41.41 3rd Qu.: -80.15 3rd Qu.: 748.0 3rd Qu.:2013-10-01 22:00:00 3rd Qu.:290.0
Max. :65.00 Max. :61.17 Max. : -68.83 Max. :6602.0 Max. :2014-01-01 04:00:00 Max. :360.0
NA's :53493 NA's :7537 NA's :7537 NA's :7537 NA's :9574
humid hour minute year type temp
Min. : 12.74 Min. : 5.00 Min. : 0.00 Min. :1956 Length:327346 Min. : 10.94
1st Qu.: 43.74 1st Qu.: 9.00 1st Qu.: 8.00 1st Qu.:1999 Class :character 1st Qu.: 42.08
Median : 57.22 Median :13.00 Median :29.00 Median :2002 Mode :character Median : 57.20
Mean : 59.21 Mean :13.14 Mean :26.23 Mean :2001 Mean : 57.01
3rd Qu.: 74.67 3rd Qu.:17.00 3rd Qu.:44.00 3rd Qu.:2006 3rd Qu.: 71.96
Max. :100.00 Max. :23.00 Max. :59.00 Max. :2013 Max. :100.04
NA's :1544 NA's :53493 NA's :1544
dewp wind_speed precip pressure visib
Min. :-9.94 Min. : 0.000 Min. :0.0000 Min. : 983.8 Min. : 0.00
1st Qu.:26.06 1st Qu.: 6.905 1st Qu.:0.0000 1st Qu.:1012.9 1st Qu.:10.00
Median :42.80 Median :10.357 Median :0.0000 Median :1017.6 Median :10.00
Mean :41.50 Mean :11.060 Mean :0.0042 Mean :1017.9 Mean : 9.29
3rd Qu.:57.92 3rd Qu.:14.960 3rd Qu.:0.0000 3rd Qu.:1022.9 3rd Qu.:10.00
Max. :78.08 Max. :42.579 Max. :1.2100 Max. :1042.1 Max. :10.00
NA's :1544 NA's :1605 NA's :1527 NA's :36142 NA's :1527
Which airport in our dataset has the highest number of departures?
flights_dt %>%
group_by(origin) %>%
ggplot() +
aes(x = origin, fill = origin) +
geom_bar() +
scale_fill_manual(values = cbPalette) +
labs(
x = "airport",
y = "departure numbers",
title = "Departure numbers by airport"
) +
guides(fill = "none") +
theme_bw()

What is the trend of delays over the year, how does it compare across the three airports?
flights_dt %>%
filter(dep_delay > 0) %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = month, y = mean_delay, colour = origin) +
geom_line(alpha = 0.6) +
geom_point(alpha = 0.8) +
labs(
x = "month",
y = "mean delay (minutes)",
title = " Mean delay by month",
colour = "airport"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

What is the number of departure delays over the year?
flights_dt %>%
filter(dep_delay > 0) %>%
group_by(month = floor_date(sched_dep_time, "month"), origin) %>%
summarise(no_of_delays = n(), .groups = "drop") %>%
ggplot() +
aes(x = month, y = no_of_delays, colour = origin) +
geom_line(alpha = 0.6) +
geom_point(alpha = 0.8) +
labs(
x = "month",
y = "number of delays",
title = " Monthly trend of departure delays",
colour = "airport"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

What is the number of flights per month?
flights_dt %>%
mutate(month = month(sched_dep_time, label = TRUE)) %>%
group_by(month, origin) %>%
summarise(no_of_flights = n(), .groups = "drop") %>%
ggplot() +
aes(x = month, y = no_of_flights, fill = origin) +
geom_col(position = "dodge", alpha = 0.8) +
labs(
x = "month",
y = "number of departures",
title = "Departure numbers by month",
fill = "airport"
) +
scale_fill_manual(values = cbPalette) +
theme_bw()

Which carrier has the most departure delays?
flights_dt %>%
filter(dep_delay > 0) %>%
group_by(carrier_name, origin) %>%
summarise(mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
geom_col(alpha = 0.8) +
facet_wrap(~ origin) +
labs(
x = "carrier",
y = "mean delay (minutes)",
title = "Mean departure delay by carrier",
fill = "airport"
) +
theme_bw() +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
coord_flip()

Which carrier has the most arrival delays?
flights_dt %>%
filter(arr_delay > 0) %>%
group_by(carrier_name, origin) %>%
summarise(mean_delay = mean(arr_delay), .groups = "drop") %>%
ggplot() +
aes(x = reorder(carrier_name, mean_delay), y = mean_delay, fill = origin) +
geom_col(alpha = 0.8) +
facet_wrap(~ origin) +
labs(
x = "carrier",
y = "mean delay (minutes)",
title = "Mean arrival delay by carrier",
fill = "airport"
) +
theme_bw() +
scale_fill_manual(values=c("#999999", "#E69F00", "#56B4E9")) +
theme(axis.text.x = element_text(angle = 0, vjust = 0.5, hjust = 1)) +
coord_flip()

Which season has the highest number of departure delays?
flights_dt %>%
filter(dep_delay > 0) %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
ggplot() +
aes(x = day, y = mean_delay, colour = origin) +
geom_point(alpha = 0.8) +
labs(
x = "date",
y = "mean delay (minutes)",
title = "Mean departure delay by month"
) +
scale_colour_manual(values = c("#999999", "#E69F00", "#56B4E9")) +
theme_bw()

Over the course of a day when is the largest average delay?
flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
select(dep_delay, hour) %>%
group_by(hour) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
ggplot() +
aes(x = hour, y = mean_delay) +
geom_point(alpha = 0.8, colour = "#56B4E9") +
geom_smooth(se = FALSE, colour = "#E69F00") +
labs(
x = "hour",
y = "mean delay (minutes)",
title = "Mean departure delay by departure time"
) +
theme_bw() +
scale_x_continuous(limits = c(5, 23), breaks = seq(5, 23, by = 1))
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

How does distance of an outbound flight affect departure delays?
flights_dt %>%
filter(origin == "EWR") %>%
ggplot() +
aes(x = distance) +
geom_histogram(bins = 50) +
theme_bw() +
labs(title = "Distribution of flight distance")

positions <- c("<500mi", "500-1000mi", "1000-1500mi", "1500-2000mi", "2000-2500mi", "2500-3000mi",
">3000mi")
flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
mutate(distance = case_when(
distance <= 500 ~ "<500mi",
distance > 500 & distance <= 1000 ~ "500-1000mi",
distance > 1000 & distance <= 1500 ~ "1000-1500mi",
distance > 1500 & distance <= 2000 ~ "1500-2000mi",
distance > 2000 & distance <= 2500 ~ "2000-2500mi",
distance > 2500 & distance <= 3000 ~ "2500-3000mi",
distance > 3000 ~ ">3000mi"
)) %>%
group_by(distance) %>%
summarise(mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = distance, y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "distance (miles)",
y = "mean departure delay (minutes)",
title = "Departure delay by flight distance"
) +
scale_x_discrete(limits = positions) +
theme_bw()

Which day is the best day to travel from Newark Int.?
flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
mutate(weekday = wday(sched_dep_time, label = TRUE)) %>%
group_by(weekday) %>%
summarise(mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = weekday, y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "weekday",
y = "mean departure delay (minutes)",
title = "Departure delay by weekday"
) +
theme_bw()

Which are the most popular destinations from Newark Int?
flights_dt %>%
filter(origin == "EWR") %>%
group_by(dest, dest_name) %>%
summarise(count = n(), .groups = "drop") %>%
arrange(desc(count)) %>%
head(10) %>%
ggplot() +
aes(x = reorder(dest_name, count), y = count) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "destination",
y = "number of flights per year",
title = "Destinations from Newark Int."
) +
theme_bw() +
coord_flip()

Which destinations suffer from the longest delays?
flights_dt %>%
drop_na(dest_name) %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(dest, dest_name) %>%
summarise(mean_delay = mean(dep_delay, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(mean_delay)) %>%
head(10) %>%
ggplot() +
aes(x = reorder(dest_name, mean_delay), y = mean_delay) +
geom_col(fill = "#999999", alpha = 0.8) +
labs(
x = "destination",
y = "mean delay (minutes)",
title = "Destinations with longest delays"
) +
theme_bw() +
coord_flip()

Trend weather conditions against mean departure delays
flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_visibility = mean(visib, na.rm = TRUE),
mean_delay = mean(dep_delay), .groups = "drop") %>%
ggplot() +
aes(x = mean_visibility, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean visibility (miles)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by visibility"
) +
theme_bw()
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_wind_speed = mean(wind_speed, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_wind_speed, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean wind speed (mph)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by wind speed"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_wind_dir = mean(wind_dir, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_wind_dir, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean wind direction (degrees)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by wind direction"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_humidity = mean(humid, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_humidity, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean humidity (%)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by humidity"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_temp = mean(temp, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_temp, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean temperature (degf)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by temperature"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_dewpoint = mean(dewp, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_dewpoint, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean dewpoint (degF)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by dewpoint"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_precip = mean(precip, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_precip, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean precipitation (inches)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by precipitation"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

flights_dt %>%
filter(dep_delay > 0 & origin == "EWR") %>%
group_by(day = floor_date(sched_dep_time, "day"), origin) %>%
summarise(mean_pressure = mean(pressure, na.rm = TRUE),
mean_delay = mean(dep_delay)) %>%
ggplot() +
aes(x = mean_pressure, y = mean_delay) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, colour = "#E69F00") +
labs(
x = "mean pressure (mbar)",
y = "mean departure delay (minutes)",
title = "Mean departure delay by pressure"
) +
theme_bw()
`summarise()` has grouped output by 'day'. You can override using the `.groups` argument.
`geom_smooth()` using formula 'y ~ x'
Warning: Removed 1 rows containing non-finite values (stat_smooth).
Warning: Removed 1 rows containing missing values (geom_point).

LS0tCnRpdGxlOiAiRXhwbG9yYXRvcnkgQW5hbHlzaXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CnBhY21hbjo6cF9sb2FkKAogIHRpZHl2ZXJzZSwKICBoZXJlLAogIFJDb2xvckJyZXdlciwKICBsdWJyaWRhdGUsCiAgc2NhbGVzLAogIEdHYWxseSwKICBzdGF0cywKICBjb3JycGxvdCwKICBsZWFwcywKICBnbG11bHRpLAogIGJyb29tLAogIHJwYXJ0LAogIHJwYXJ0LnBsb3QsCiAgbW9kZWxyLAogIHlhcmRzdGljaywKICBjYXJldCwKICByYW5nZXIKKQpgYGAKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmZsaWdodHNfZHQgPC0gcmVhZF9jc3YoaGVyZSgiY2xlYW5fZGF0YS9mbGlnaHRzX2NsZWFuLmNzdiIpKQoKY2JQYWxldHRlIDwtIGMoIiM5OTk5OTkiLCAiI0U2OUYwMCIsICIjNTZCNEU5IiwgIiMwMDlFNzMiLCAiI0YwRTQ0MiIsICIjMDA3MkIyIiwgIiNENTVFMDAiLCAiI0NDNzlBNyIpCgpzdW1tYXJ5KGZsaWdodHNfZHQpCmBgYAoKIyBXaGljaCBhaXJwb3J0IGluIG91ciBkYXRhc2V0IGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGVwYXJ0dXJlcz8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBncm91cF9ieShvcmlnaW4pICU+JQogIGdncGxvdCgpICsKICBhZXMoeCA9IG9yaWdpbiwgZmlsbCA9IG9yaWdpbikgKwogIGdlb21fYmFyKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIGxhYnMoCiAgICB4ID0gImFpcnBvcnQiLAogICAgeSA9ICJkZXBhcnR1cmUgbnVtYmVycyIsCiAgICB0aXRsZSA9ICJEZXBhcnR1cmUgbnVtYmVycyBieSBhaXJwb3J0IgogICkgKwogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hhdCBpcyB0aGUgdHJlbmQgb2YgZGVsYXlzIG92ZXIgdGhlIHllYXIsIGhvdyBkb2VzIGl0IGNvbXBhcmUgYWNyb3NzIHRoZSB0aHJlZSBhaXJwb3J0cz8KCmBgYHtyLHdhcm5pbmc9RkFMU0V9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwKSAlPiUgCiAgZ3JvdXBfYnkobW9udGggPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAibW9udGgiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtb250aCwgeSA9IG1lYW5fZGVsYXksIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fbGluZShhbHBoYSA9IDAuNikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJtb250aCIsCiAgICB5ID0gIm1lYW4gZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIiBNZWFuIGRlbGF5IGJ5IG1vbnRoIiwKICAgIGNvbG91ciA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBkZXBhcnR1cmUgZGVsYXlzIG92ZXIgdGhlIHllYXI/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KG1vbnRoID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgIm1vbnRoIiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9kZWxheXMgPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtb250aCwgeSA9IG5vX29mX2RlbGF5cywgY29sb3VyID0gb3JpZ2luKSArCiAgZ2VvbV9saW5lKGFscGhhID0gMC42KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibnVtYmVyIG9mIGRlbGF5cyIsCiAgICB0aXRsZSA9ICIgTW9udGhseSB0cmVuZCBvZiBkZXBhcnR1cmUgZGVsYXlzIiwKICAgIGNvbG91ciA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoYXQgaXMgdGhlIG51bWJlciBvZiBmbGlnaHRzIHBlciBtb250aD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIG11dGF0ZShtb250aCA9IG1vbnRoKHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkobW9udGgsIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShub19vZl9mbGlnaHRzID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbW9udGgsIHkgPSBub19vZl9mbGlnaHRzLCBmaWxsID0gb3JpZ2luKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIm1vbnRoIiwKICAgIHkgPSAibnVtYmVyIG9mIGRlcGFydHVyZXMiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIG51bWJlcnMgYnkgbW9udGgiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNiUGFsZXR0ZSkgKwogIHRoZW1lX2J3KCkKYGBgCgojIFdoaWNoIGNhcnJpZXIgaGFzIHRoZSBtb3N0IGRlcGFydHVyZSBkZWxheXM/CgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDApICU+JSAKICBncm91cF9ieShjYXJyaWVyX25hbWUsIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gcmVvcmRlcihjYXJyaWVyX25hbWUsIG1lYW5fZGVsYXkpLCB5ID0gbWVhbl9kZWxheSwgZmlsbCA9IG9yaWdpbikgKwogIGdlb21fY29sKGFscGhhID0gMC44KSArCiAgZmFjZXRfd3JhcCh+IG9yaWdpbikgKwogIGxhYnMoCiAgICB4ID0gImNhcnJpZXIiLAogICAgeSA9ICJtZWFuIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBjYXJyaWVyIiwKICAgIGZpbGwgPSAiYWlycG9ydCIKICApICsKICB0aGVtZV9idygpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMSkpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIFdoaWNoIGNhcnJpZXIgaGFzIHRoZSBtb3N0IGFycml2YWwgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihhcnJfZGVsYXkgPiAwKSAlPiUgCiAgZ3JvdXBfYnkoY2Fycmllcl9uYW1lLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oYXJyX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IHJlb3JkZXIoY2Fycmllcl9uYW1lLCBtZWFuX2RlbGF5KSwgeSA9IG1lYW5fZGVsYXksIGZpbGwgPSBvcmlnaW4pICsKICBnZW9tX2NvbChhbHBoYSA9IDAuOCkgKwogIGZhY2V0X3dyYXAofiBvcmlnaW4pICsKICBsYWJzKAogICAgeCA9ICJjYXJyaWVyIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBhcnJpdmFsIGRlbGF5IGJ5IGNhcnJpZXIiLAogICAgZmlsbCA9ICJhaXJwb3J0IgogICkgKwogIHRoZW1lX2J3KCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCB2anVzdCA9IDAuNSwgaGp1c3QgPSAxKSkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCiMgV2hpY2ggc2Vhc29uIGhhcyB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGVwYXJ0dXJlIGRlbGF5cz8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCkgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSwgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRheSwgeSA9IG1lYW5fZGVsYXksIGNvbG91ciA9IG9yaWdpbikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjgpICsKICBsYWJzKAogICAgeCA9ICJkYXRlIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgbW9udGgiCiAgKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjOTk5OTk5IiwgIiNFNjlGMDAiLCAiIzU2QjRFOSIpKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgT3ZlciB0aGUgY291cnNlIG9mIGEgZGF5IHdoZW4gaXMgdGhlIGxhcmdlc3QgYXZlcmFnZSBkZWxheT8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIHNlbGVjdChkZXBfZGVsYXksIGhvdXIpICU+JQogIGdyb3VwX2J5KGhvdXIpICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5LCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gaG91ciwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC44LCBjb2xvdXIgPSAiIzU2QjRFOSIpICsKICBnZW9tX3Ntb290aChzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJob3VyIiwKICAgIHkgPSAibWVhbiBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgZGVwYXJ0dXJlIHRpbWUiCiAgKSArCiAgdGhlbWVfYncoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoNSwgMjMpLCBicmVha3MgPSBzZXEoNSwgMjMsIGJ5ID0gMSkpCmBgYAojIEhvdyBkb2VzIGRpc3RhbmNlIG9mIGFuIG91dGJvdW5kIGZsaWdodCBhZmZlY3QgZGVwYXJ0dXJlIGRlbGF5cz8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gZGlzdGFuY2UpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gNTApICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBmbGlnaHQgZGlzdGFuY2UiKQpgYGAKCmBgYHtyfQpwb3NpdGlvbnMgPC0gYygiPDUwMG1pIiwgIjUwMC0xMDAwbWkiLCAiMTAwMC0xNTAwbWkiLCAiMTUwMC0yMDAwbWkiLCAiMjAwMC0yNTAwbWkiLCAiMjUwMC0zMDAwbWkiLAogICAgICAgICAgICAgICAiPjMwMDBtaSIpCgpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIG11dGF0ZShkaXN0YW5jZSA9IGNhc2Vfd2hlbigKICAgIGRpc3RhbmNlIDw9IDUwMCB+ICI8NTAwbWkiLAogICAgZGlzdGFuY2UgPiA1MDAgJiBkaXN0YW5jZSA8PSAxMDAwIH4gIjUwMC0xMDAwbWkiLAogICAgZGlzdGFuY2UgPiAxMDAwICYgZGlzdGFuY2UgPD0gMTUwMCB+ICIxMDAwLTE1MDBtaSIsCiAgICBkaXN0YW5jZSA+IDE1MDAgJiBkaXN0YW5jZSA8PSAyMDAwIH4gIjE1MDAtMjAwMG1pIiwKICAgIGRpc3RhbmNlID4gMjAwMCAmIGRpc3RhbmNlIDw9IDI1MDAgfiAiMjAwMC0yNTAwbWkiLAogICAgZGlzdGFuY2UgPiAyNTAwICYgZGlzdGFuY2UgPD0gMzAwMCB+ICIyNTAwLTMwMDBtaSIsCiAgICBkaXN0YW5jZSA+IDMwMDAgfiAiPjMwMDBtaSIKICApKSAlPiUgCiAgZ3JvdXBfYnkoZGlzdGFuY2UpICU+JSAKICBzdW1tYXJpc2UobWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fY29sKGZpbGwgPSAiIzk5OTk5OSIsIGFscGhhID0gMC44KSArCiAgbGFicygKICAgIHggPSAiZGlzdGFuY2UgKG1pbGVzKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJEZXBhcnR1cmUgZGVsYXkgYnkgZmxpZ2h0IGRpc3RhbmNlIgogICkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gcG9zaXRpb25zKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hpY2ggZGF5IGlzIHRoZSBiZXN0IGRheSB0byB0cmF2ZWwgZnJvbSBOZXdhcmsgSW50Lj8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgbXV0YXRlKHdlZWtkYXkgPSB3ZGF5KHNjaGVkX2RlcF90aW1lLCBsYWJlbCA9IFRSVUUpKSAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gd2Vla2RheSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gIndlZWtkYXkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiRGVwYXJ0dXJlIGRlbGF5IGJ5IHdlZWtkYXkiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCiMgV2hpY2ggYXJlIHRoZSBtb3N0IHBvcHVsYXIgZGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludD8KCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIob3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGVzdCwgZGVzdF9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lIAogIGhlYWQoMTApICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSByZW9yZGVyKGRlc3RfbmFtZSwgY291bnQpLCB5ID0gY291bnQpICsKICBnZW9tX2NvbChmaWxsID0gIiM5OTk5OTkiLCBhbHBoYSA9IDAuOCkgKwogIGxhYnMoCiAgICB4ID0gImRlc3RpbmF0aW9uIiwKICAgIHkgPSAibnVtYmVyIG9mIGZsaWdodHMgcGVyIHllYXIiLAogICAgdGl0bGUgPSAiRGVzdGluYXRpb25zIGZyb20gTmV3YXJrIEludC4iCiAgKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBXaGljaCBkZXN0aW5hdGlvbnMgc3VmZmVyIGZyb20gdGhlIGxvbmdlc3QgZGVsYXlzPwoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZHJvcF9uYShkZXN0X25hbWUpICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRlc3QsIGRlc3RfbmFtZSkgJT4lIAogIHN1bW1hcmlzZShtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXksIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JSAKICBhcnJhbmdlKGRlc2MobWVhbl9kZWxheSkpICU+JSAKICBoZWFkKDEwKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gcmVvcmRlcihkZXN0X25hbWUsIG1lYW5fZGVsYXkpLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fY29sKGZpbGwgPSAiIzk5OTk5OSIsIGFscGhhID0gMC44KSArCiAgbGFicygKICAgIHggPSAiZGVzdGluYXRpb24iLAogICAgeSA9ICJtZWFuIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJEZXN0aW5hdGlvbnMgd2l0aCBsb25nZXN0IGRlbGF5cyIKICApICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIFRyZW5kIHdlYXRoZXIgY29uZGl0aW9ucyBhZ2FpbnN0IG1lYW4gZGVwYXJ0dXJlIGRlbGF5cwoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl92aXNpYmlsaXR5ID0gbWVhbih2aXNpYiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5fdmlzaWJpbGl0eSwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gIiNFNjlGMDAiKSArCiAgbGFicygKICAgIHggPSAibWVhbiB2aXNpYmlsaXR5IChtaWxlcykiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgdmlzaWJpbGl0eSIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl93aW5kX3NwZWVkID0gbWVhbih3aW5kX3NwZWVkLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl93aW5kX3NwZWVkLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHdpbmQgc3BlZWQgKG1waCkiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgd2luZCBzcGVlZCIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lIAogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl93aW5kX2RpciA9IG1lYW4od2luZF9kaXIsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3dpbmRfZGlyLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHdpbmQgZGlyZWN0aW9uIChkZWdyZWVzKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSB3aW5kIGRpcmVjdGlvbiIKICApICsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CmZsaWdodHNfZHQgJT4lCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2h1bWlkaXR5ID0gbWVhbihodW1pZCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxheSA9IG1lYW4oZGVwX2RlbGF5KSkgJT4lIAogIGdncGxvdCgpICsKICBhZXMoeCA9IG1lYW5faHVtaWRpdHksIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gaHVtaWRpdHkgKCUpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IGh1bWlkaXR5IgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX3RlbXAgPSBtZWFuKHRlbXAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3RlbXAsIHkgPSBtZWFuX2RlbGF5KSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGNvbG91ciA9ICIjRTY5RjAwIikgKwogIGxhYnMoCiAgICB4ID0gIm1lYW4gdGVtcGVyYXR1cmUgKGRlZ2YpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHRlbXBlcmF0dXJlIgogICkgKwogIHRoZW1lX2J3KCkKYGBgCgpgYGB7cn0KZmxpZ2h0c19kdCAlPiUgCiAgZmlsdGVyKGRlcF9kZWxheSA+IDAgJiBvcmlnaW4gPT0gIkVXUiIpICU+JSAKICBncm91cF9ieShkYXkgPSBmbG9vcl9kYXRlKHNjaGVkX2RlcF90aW1lLCAiZGF5IiksIG9yaWdpbikgJT4lIAogIHN1bW1hcmlzZShtZWFuX2Rld3BvaW50ID0gbWVhbihkZXdwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2RlbGF5ID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgZ2dwbG90KCkgKwogIGFlcyh4ID0gbWVhbl9kZXdwb2ludCwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gIiNFNjlGMDAiKSArCiAgbGFicygKICAgIHggPSAibWVhbiBkZXdwb2ludCAoZGVnRikiLAogICAgeSA9ICJtZWFuIGRlcGFydHVyZSBkZWxheSAobWludXRlcykiLAogICAgdGl0bGUgPSAiTWVhbiBkZXBhcnR1cmUgZGVsYXkgYnkgZGV3cG9pbnQiCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JSAKICBmaWx0ZXIoZGVwX2RlbGF5ID4gMCAmIG9yaWdpbiA9PSAiRVdSIikgJT4lIAogIGdyb3VwX2J5KGRheSA9IGZsb29yX2RhdGUoc2NoZWRfZGVwX3RpbWUsICJkYXkiKSwgb3JpZ2luKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fcHJlY2lwID0gbWVhbihwcmVjaXAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3ByZWNpcCwgeSA9IG1lYW5fZGVsYXkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3VyID0gIiNFNjlGMDAiKSArCiAgbGFicygKICAgIHggPSAibWVhbiBwcmVjaXBpdGF0aW9uIChpbmNoZXMpIiwKICAgIHkgPSAibWVhbiBkZXBhcnR1cmUgZGVsYXkgKG1pbnV0ZXMpIiwKICAgIHRpdGxlID0gIk1lYW4gZGVwYXJ0dXJlIGRlbGF5IGJ5IHByZWNpcGl0YXRpb24iCiAgKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpmbGlnaHRzX2R0ICU+JQogIGZpbHRlcihkZXBfZGVsYXkgPiAwICYgb3JpZ2luID09ICJFV1IiKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZmxvb3JfZGF0ZShzY2hlZF9kZXBfdGltZSwgImRheSIpLCBvcmlnaW4pICU+JSAKICBzdW1tYXJpc2UobWVhbl9wcmVzc3VyZSA9IG1lYW4ocHJlc3N1cmUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsYXkgPSBtZWFuKGRlcF9kZWxheSkpICU+JSAKICBnZ3Bsb3QoKSArCiAgYWVzKHggPSBtZWFuX3ByZXNzdXJlLCB5ID0gbWVhbl9kZWxheSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvdXIgPSAiI0U2OUYwMCIpICsKICBsYWJzKAogICAgeCA9ICJtZWFuIHByZXNzdXJlIChtYmFyKSIsCiAgICB5ID0gIm1lYW4gZGVwYXJ0dXJlIGRlbGF5IChtaW51dGVzKSIsCiAgICB0aXRsZSA9ICJNZWFuIGRlcGFydHVyZSBkZWxheSBieSBwcmVzc3VyZSIKICApICsKICB0aGVtZV9idygpCmBgYAoKCgo=